home *** CD-ROM | disk | FTP | other *** search
- {
- After much trial and error, and finding some helpful code from the SWAG
- support team (thanks!) this is what I came up with. It can handle text
- files up to 750,000 bytes and does basically what I'm looking for, but
- the scrolling isn't as smooth as it should be. Also, the lines of
- text are limited to 79 characters... (The source code can probably be
- streamlined a lot too, like I said, I'm fairly new at this...)
- }
-
- Program Reader;
-
- uses Crt, Dos;
-
- {$R-,S- }
-
- Procedure GetFileMode; Assembler;
-
- Asm
- CLC
- CMP ES:[DI].TextRec.Mode, fmInput
- JE @1
- MOV [InOutRes], 104 { 'File not opened For reading' }
- xor AX, AX { Zero out Function result }
- xor DX, DX
- STC
- @1:
- end; { GetFileMode }
-
- Function TextFilePos(Var f : Text) : LongInt; Assembler;
-
- Asm
- LES DI, f
- CALL GetFileMode
- JC @1
-
- xor CX, CX { Get position of File Pointer }
- xor DX, DX
- MOV BX, ES:[DI].TextRec.handle
- MOV AX, 4201h
- inT 21h { offset := offset-Bufend+BufPos }
- xor BX, BX
- SUB AX, ES:[DI].TextRec.Bufend
- SBB DX, BX
- ADD AX, ES:[DI].TextRec.BufPos
- ADC DX, BX
- @1:
- end; { TextFilePos }
-
-
- Function TextFileSize(Var f : Text) : LongInt; Assembler;
-
- Asm
- LES DI, f
- CALL GetFileMode
- JC @1
-
- xor CX, CX { Get position of File Pointer }
- xor DX, DX
- MOV BX, ES:[DI].TextRec.handle
- MOV AX, 4201h
- inT 21h
- PUSH DX { Save current offset on the stack }
- PUSH AX
- xor DX, DX { Move File Pointer to Eof }
- MOV AX, 4202h
- inT 21h
- POP SI
- POP CX
- PUSH DX { Save Eof position }
- PUSH AX
- MOV DX, SI { Restore old offset }
- MOV AX, 4200h
- inT 21h
- POP AX { Return result}
- POP DX
- @1:
- end; { TextFileSize }
-
- Procedure TextSeek(Var f : Text; n : LongInt); Assembler;
-
- Asm
- LES DI, f
- CALL GetFileMode
- JC @2
-
- MOV CX, Word Ptr n+2 { Move File Pointer }
- MOV DX, Word Ptr n
- MOV BX, ES:[DI].TextRec.Handle
- MOV AX, 4200h
- inT 21h
- JNC @1 { Carry flag = reading past Eof }
- MOV [InOutRes], AX
- JMP @2
-
- { Force read next time }
- @1: MOV AX, ES:[DI].TextRec.Bufend
- MOV ES:[DI].TextRec.BufPos, AX
- @2:
- end; { TextSeek }
- {end TextUtil }
-
-
- Procedure HideCursor; assembler;
- asm
- mov ah,$01 { Function number }
- mov ch,$20
- mov cl,$00
- Int $10 { Call BIOS }
- end; { HideCursor }
-
-
- Procedure RestoreCursor; assembler;
- asm
- mov ah,$01 { Function number }
- mov ch,$06 { Starting scan line }
- mov cl,$07 { Ending scan line }
- int $10 { Call BIOS }
- end; { RestoreCursor }
-
-
- Var
- TxtFile : text;
- s : string[79];
- Cee : CHAR;
-
- Label RWLoop, Final, FileSizeError, WrongKey, NoParamError;
-
- Var
- Size : Longint;
- YY, GG, Counter : LongInt;
- LineNumArray : Array[0..15000] Of LongInt;
- MyText : Array[0..23] Of String[79];
- InstructStr : String[79];
- OrigColor, ColorSwitch : Integer;
- LineNo : String[5];
- Begin
- OrigColor := TextAttr;
- TextColor(11);
- TextBackground(1);
- InstructStr := 'Scroll (^) up - (v) down - (Page up/down) - (Home) - (End) - (ESC) Quit';
- If ParamStr(1) = '' Then GoTo NoParamError;
- Assign(TxtFile, ParamStr(1)); {'TEXTFILE.DOC';}
- Reset(TxtFile);
- Counter := -1;
- ClrScr;
- HideCursor;
- If (TextFileSize(TxtFile)) >= 750000 Then GoTo FileSizeError;
- While Not EOF(TxtFile) Do
- Begin
- Inc(Counter,1);
- LineNumArray[Counter] := TextFilePos(TxtFile);
- ReadLn(TxtFile);
- End;
- Inc(Counter,1);
- YY:=0;
-
-
- RWLoop:
- For GG:=0+YY TO 23+YY DO
- Begin
- TextSeek(TxtFile,LineNumArray[GG]);
- ReadLn(TxtFile,S);
- MyText[GG-YY]:=S;
- End;
- GoToXY(1,1);
- ColorSwitch := TextAttr;
- Str(yy+23:5,LineNo);
-
- Repeat Until Port[$3DA] And 8 = 8; { Wait For Vertical retrace }
-
- For GG:=0 TO 23 DO
- Begin
- ClrEOL;
- WriteLn(MyText[GG]);
- End;
- GoToXY(2,25);
- TextColor(14);
- Write(LineNo);
- GoToXY(8,25);
- TextColor(15);
- Write(InstructStr);
- TextAttr:=ColorSwitch;
-
- Delay(1);
- WrongKey:
- Repeat
- Until KeyPressed;
- Cee := ReadKey;
-
- If Cee=Chr(27) Then GoTo Final
- Else If Cee=Chr(72) Then {UP ARROW}
- Begin
- If YY>0 Then Dec(YY,1);
- GoTo RWLoop;
- End
- Else If Cee=Chr(80) Then {DOWN ARROW}
- Begin
- Inc(YY,1);
- If YY>=Counter-23 Then YY:= Counter-24;
- GoTo RWLoop;
- End
- Else If Cee=Chr(73) Then {PAGE UP}
- Begin
- YY:=YY-24;
- If YY<1 Then YY:=0;
- GoTo RWLoop;
- End
- Else If Cee=Chr(81) Then {PAGEDOWN}
- Begin
- YY:= YY+24;
- If YY>=Counter-23 Then YY:= Counter-24;
- GoTo RWLoop;
- End
- Else If Cee=Chr(71) Then {HOME}
- Begin
- YY:=0;
- GoTo RWLoop;
- End
- Else If Cee=Chr(79) Then {End}
- Begin
- YY:= Counter-24;
- GoTo RWLoop;
- End;
-
- GoTo WrongKey;
-
- FileSizeError:
- WriteLn;
- WriteLn('ERROR...');
- WriteLn;
- WriteLn('File Size Larger Than 750,000');
- GoTo Final;
-
- NoParamError:
- WriteLn;
- WriteLn('ERROR...');
- WriteLn;
- WriteLn('Command line syntax is Reader C:\TextFile.txt');
- GoTo Final;
-
- Final:
- Close(TxtFile);
- TextAttr := OrigColor;
- RestoreCursor;
- ClrScr;
- End.